home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / editors / emacs / xemacs / xemacs-1.006 / xemacs-1 / lib / xemacs-19.13 / lisp / ediff / ediff-init.el < prev    next >
Encoding:
Text File  |  1995-08-11  |  51.8 KB  |  1,372 lines

  1. ;;; ediff-init.el --- Macros, variables, and defsubsts used by Ediff
  2. ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  3.  
  4. ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
  5.  
  6. ;; This file is part of GNU Emacs.
  7.  
  8. ;; GNU Emacs is free software; you can redistribute it and/or modify
  9. ;; it under the terms of the GNU General Public License as published by
  10. ;; the Free Software Foundation; either version 2, or (at your option)
  11. ;; any later version.
  12.  
  13. ;; GNU Emacs is distributed in the hope that it will be useful,
  14. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ;; GNU General Public License for more details.
  17.  
  18. ;; You should have received a copy of the GNU General Public License
  19. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  20. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22.  
  23. ;; Is it XEmacs?
  24. (defconst ediff-xemacs-p (string-match "XEmacs" emacs-version))
  25. ;; Is it Emacs?
  26. (defconst ediff-emacs-p (not ediff-xemacs-p))
  27. ;; Are we running as a window application or on a TTY?
  28. (defsubst ediff-device-type ()
  29.   (if ediff-emacs-p
  30.       window-system
  31.     (device-type (selected-device))))
  32. ;; in XEmacs: device-type is tty on tty and stream in batch.
  33. (defsubst ediff-window-display-p ()
  34.   (and (ediff-device-type) (not (memq (ediff-device-type) '(tty stream)))))
  35.  
  36. ;;; Macros
  37. (defmacro ediff-odd-p (arg)
  38.   (` (eq (logand (, arg) 1) 1)))
  39.  
  40. (defmacro ediff-buffer-live-p (buf)
  41.   (` (and (, buf) (get-buffer (, buf)) (buffer-name (get-buffer (, buf))))))
  42.  
  43. (defmacro ediff-get-buffer (arg)
  44.   (` (cond ((eq (, arg) 'A) ediff-buffer-A)
  45.        ((eq (, arg) 'B) ediff-buffer-B)
  46.        ((eq (, arg) 'C) ediff-buffer-C)
  47.        ((eq (, arg) 'Ancestor) ediff-ancestor-buffer)
  48.        )
  49.   ))
  50.   
  51. (defmacro ediff-get-value-according-to-buffer-type (buf-type list)
  52.   (` (cond ((eq (, buf-type) 'A) (nth 0 (, list)))
  53.        ((eq (, buf-type) 'B) (nth 1 (, list)))
  54.        ((eq (, buf-type) 'C) (nth 2 (, list))))))
  55.        
  56. (defmacro ediff-char-to-buftype (arg)
  57.   (` (cond ((memq (, arg) '(?a ?A)) 'A)
  58.        ((memq (, arg) '(?b ?B)) 'B)
  59.        ((memq (, arg) '(?c ?C)) 'C)
  60.        )
  61.   ))
  62.   
  63. (defmacro ediff-get-difference (n buf-type)
  64.   (` (aref
  65.       (symbol-value
  66.        (intern (format "ediff-difference-vector-%S" (, buf-type)))) (, n))))
  67.   
  68. ;; tell if it has been previously determined that the region has
  69. ;; no diffs other than the white space and newlines
  70. ;; The argument, N, is the diff region number used by Ediff to index the
  71. ;; diff vector. It is 1 less than the number seen by the user.
  72. ;;
  73. ;; A difference vector has the form:
  74. ;; [diff diff diff ...]
  75. ;; where each diff has the form:
  76. ;; [overlay fine-diff-vector no-fine-diffs-flag]
  77. ;; fine-diff-vector is a vector [fine-diff fine-diff fine-diff ...]
  78. (defmacro ediff-no-fine-diffs-p (n)
  79.   (` (aref (ediff-get-difference (, n) 'A) 2)))
  80.   
  81. (defmacro ediff-get-diff-overlay-from-diff-record (diff-rec)
  82.   (` (aref (, diff-rec) 0)))
  83.   
  84. (defmacro ediff-get-diff-overlay (n buf-type)  
  85.   (` (ediff-get-diff-overlay-from-diff-record
  86.       (ediff-get-difference (, n) (, buf-type)))))
  87.  
  88. (defmacro ediff-get-fine-diff-vector-from-diff-record (diff-rec)
  89.   (` (aref (, diff-rec) 1)))
  90.       
  91. (defmacro ediff-set-fine-diff-vector (n buf-type fine-vec)
  92.   (` (aset (ediff-get-difference (, n) (, buf-type)) 1 (, fine-vec))))
  93.   
  94. (defmacro ediff-get-state-of-diff (n buf-type)
  95.   (` (if (ediff-buffer-live-p ediff-buffer-C)
  96.      (aref (ediff-get-difference (, n) (, buf-type)) 3))))
  97. (defmacro ediff-set-state-of-diff (n buf-type val)
  98.   (` (aset (ediff-get-difference (, n) (, buf-type)) 3 (, val))))
  99. (defmacro ediff-get-state-of-merge (n)
  100.   (` (if ediff-state-of-merge
  101.      (aref (aref ediff-state-of-merge (, n)) 0))))
  102. (defmacro ediff-get-state-of-ancestor (n)
  103.   (` (if ediff-state-of-merge
  104.      (aref (aref ediff-state-of-merge (, n)) 1))))
  105. (defmacro ediff-set-state-of-merge (n val)
  106.   (` (if ediff-state-of-merge
  107.      (aset (aref ediff-state-of-merge (, n)) 0 (, val)))))
  108.  
  109. ;; if flag is t, puts a mark on diff region saying that 
  110. ;; the differences are in white space only. If flag is nil,
  111. ;; the region is marked as essential (i.e., differences are
  112. ;; not just in the white space and newlines.)
  113. (defmacro ediff-mark-diff-as-space-only (n flag)
  114.   (` (aset (ediff-get-difference (, n) 'A) 2 (, flag))))
  115.   
  116. (defmacro ediff-get-fine-diff-vector (n buf-type)
  117.   (` (ediff-get-fine-diff-vector-from-diff-record
  118.       (ediff-get-difference (, n) (, buf-type)))))
  119.   
  120.   
  121. ;; Defines SYMBOL as an advertised local variable.  
  122. ;; Performs a defvar, then executes `make-variable-buffer-local' on
  123. ;; the variable.  Also sets the `permanent-local' property,
  124. ;; so that `kill-all-local-variables' (called by major-mode setting
  125. ;; commands) won't destroy Ediff control variables.
  126. ;; 
  127. ;; Plagiarised from `emerge-defvar-local' for XEmacs.
  128. (defmacro ediff-defvar-local (var value doc) 
  129.   (` (progn
  130.        (defvar (, var) (, value) (, doc))
  131.        (make-variable-buffer-local '(, var))
  132.        (put '(, var) 'permanent-local t))))
  133.     
  134. ;; Macro to switch to BUFFER, evaluate FORMS, returns to original buffer.
  135. ;; Differs from `save-excursion' in that it doesn't save the point and mark.
  136. ;; This is essentially `emerge-eval-in-buffer' with the test for live buffers."
  137. (defmacro ediff-eval-in-buffer (buffer &rest forms)
  138.   (` (let ((StartBuffer (current-buffer)))
  139.        (if (ediff-buffer-live-p (, buffer))
  140.        (unwind-protect
  141.            (progn
  142.          (set-buffer (, buffer))
  143.          (,@ forms))
  144.          (set-buffer StartBuffer))
  145.      (or (eq this-command 'ediff-quit)
  146.          (error
  147.           "You've killed an essential Ediff buffer---Please quit Ediff"))
  148.      ))))
  149.      
  150.  
  151. (defsubst ediff-multiframe-setup-p ()
  152.   (and (ediff-window-display-p) ediff-multiframe))
  153.              
  154. (defmacro ediff-narrow-control-frame-p ()
  155.   (` (and (ediff-multiframe-setup-p)
  156.       (equal ediff-help-message ediff-brief-message-string))))
  157.       
  158. (defmacro ediff-3way-comparison-job ()
  159.   (` (memq
  160.       ediff-job-name
  161.       '(ediff-files3 ediff-buffers3))))
  162. (ediff-defvar-local ediff-3way-comparison-job nil "")
  163.       
  164. (defmacro ediff-merge-job ()
  165.   (` (memq
  166.       ediff-job-name
  167.       '(ediff-merge-files
  168.     ediff-merge-buffers
  169.     ediff-merge-files-with-ancestor
  170.     ediff-merge-buffers-with-ancestor
  171.     ediff-merge-revisions
  172.     ediff-merge-revisions-with-ancestor))))
  173. (ediff-defvar-local ediff-merge-job nil "")
  174.  
  175. (defmacro ediff-merge-with-ancestor-job ()
  176.   (` (memq
  177.       ediff-job-name
  178.       '(ediff-merge-files-with-ancestor
  179.     ediff-merge-buffers-with-ancestor
  180.     ediff-merge-revisions-with-ancestor))))
  181. (ediff-defvar-local ediff-merge-with-ancestor-job nil "")
  182.  
  183. (defmacro ediff-3way-job ()
  184.   (` (or ediff-3way-comparison-job ediff-merge-job)))
  185. (ediff-defvar-local ediff-3way-job nil "")
  186.  
  187. ;; A diff3 job is like a 3way job, but ediff-merge doesn't require the use
  188. ;; of diff3.
  189. (defmacro ediff-diff3-job ()
  190.   (` (or ediff-3way-comparison-job
  191.      ediff-merge-with-ancestor-job)))
  192. (ediff-defvar-local ediff-diff3-job nil "")
  193.      
  194. (defmacro ediff-windows-job ()
  195.   (` (memq ediff-job-name '(ediff-windows-wordwise ediff-windows-linewise))))
  196. (ediff-defvar-local ediff-windows-job nil "")
  197.  
  198. (defmacro ediff-word-mode-job ()
  199.   (` (memq ediff-job-name '(ediff-windows-wordwise  ediff-regions-wordwise))))
  200. (ediff-defvar-local ediff-word-mode-job nil "")
  201.  
  202. (defmacro ediff-narrow-job ()
  203.   (` (memq ediff-job-name '(ediff-windows-wordwise
  204.                 ediff-regions-wordwise
  205.                 ediff-windows-linewise
  206.                 ediff-regions-linewise))))
  207. (ediff-defvar-local ediff-narrow-job nil "")
  208.  
  209. ;; Note: ediff-merge-directory-revisions-with-ancestor is not treated as an
  210. ;; ancestor metajob, since it behaves differently.
  211. (defsubst ediff-ancestor-metajob (&optional metajob)
  212.   (memq (or metajob ediff-metajob-name)
  213.     '(ediff-merge-directories-with-ancestor
  214.       ediff-merge-filegroups-with-ancestor)))
  215. (defsubst ediff-revision-metajob (&optional metajob)
  216.   (memq (or metajob ediff-metajob-name)
  217.     '(ediff-directory-revisions 
  218.       ediff-merge-directory-revisions
  219.       ediff-merge-directory-revisions-with-ancestor)))
  220. ;; metajob involving only one directory
  221. (defsubst ediff-dir1-metajob (&optional metajob)
  222.   (or (ediff-revision-metajob metajob)
  223.       ;; add more here
  224.       ))
  225. (defsubst ediff-collect-diffs-metajob (&optional metajob)
  226.   (or (ediff-revision-metajob metajob)
  227.       (memq ediff-metajob-name
  228.         '(ediff-directories
  229.           ;; add more here
  230.           ediff-directory-revisions))))
  231. (defsubst ediff-metajob3 (&optional metajob)
  232.   (memq (or metajob ediff-metajob-name)
  233.     '(ediff-merge-directories-with-ancestor
  234.       ediff-merge-filegroups-with-ancestor 
  235.       ediff-directories3
  236.       ediff-filegroups3)))
  237. (defsubst ediff-comparison-metajob3 (&optional metajob)
  238.   (memq (or metajob ediff-metajob-name)
  239.     '(ediff-directories3 ediff-filegroups3)))
  240.  
  241.  
  242. ;; Hook variables
  243.  
  244. (defvar ediff-before-setup-windows-hooks nil
  245.   "*Hooks to run before Ediff sets its own window config. 
  246. This can be used to save the previous window config, which can be restored
  247. on ediff-quit or ediff-suspend.") 
  248. (defvar ediff-after-setup-windows-hooks nil
  249.   "*Hooks to run after Ediff sets its own window config. 
  250. This can be used to set up control window or icon in a desired place.")
  251. (defvar ediff-before-setup-control-frame-hooks nil
  252.   "*Hooks run before setting up the frame to display Ediff Control Panel.
  253. Can be used to change control frame parameters to position it where it
  254. is desirable.")
  255. (defvar ediff-after-setup-control-frame-hooks nil
  256.   "*Hooks run after setting up the frame to display Ediff Control Panel.
  257. Can be used to move the frame where it is desired.")
  258. (defvar ediff-startup-hooks nil
  259.   "*Hooks to run in the control buffer after Ediff has been set up.")
  260. (defvar ediff-select-hooks nil
  261.   "*Hooks to run after a difference has been selected.")
  262. (defvar ediff-unselect-hooks nil
  263.   "*Hooks to run after a difference has been unselected.")
  264. (defvar ediff-prepare-buffer-hooks  nil
  265.   "*Hooks called after buffers A, B, and C are set up.")
  266. (defvar ediff-load-hooks nil
  267.   "*Hook run after Ediff is loaded.  Can be used to change defaults.")
  268.   
  269. (defvar ediff-mode-hooks nil
  270.   "*Hook run just after ediff-mode is set up in the control buffer. 
  271. This is done before any windows or frames are created. One can use it to
  272. set local variables that determine how the display looks like.")
  273. (defvar ediff-keymap-setup-hooks nil
  274.   "*Hook run just after the default bindings in Ediff keymap are set up.")
  275.   
  276. (defvar ediff-display-help-hooks nil
  277.   "*Hooks run after preparing the help message.")
  278.  
  279. (defvar ediff-suspend-hooks (list 'ediff-default-suspend-hook)
  280.   "*Hooks to run in the Ediff control buffer when Ediff is suspended.")
  281. (defvar ediff-quit-hooks (list 'ediff-cleanup-mess)
  282.   "*Hooks to run in the Ediff control buffer after finishing Ediff.") 
  283. (defvar ediff-cleanup-hooks nil
  284.   "*Hooks to run on exiting Ediff but before killing the control buffer.
  285. This is a place to do various cleanups, such as deleting the variant buffers.
  286. Ediff provides a function, `ediff-janitor', as one such possible hook.")
  287.  
  288.  
  289. ;; Help messages
  290.  
  291. (defconst ediff-long-help-message-head
  292.   "   Moving around     |     Toggling features     |       Manipulations
  293. =====================|===========================|============================="
  294.   "The head of the full help message.")
  295. (defconst ediff-long-help-message-tail
  296.   "=====================|===========================|=============================
  297.     R -show registry |                           |  M   -show session group
  298.     D -diff output   |     E -browse Ediff manual|  G   -send bug report   
  299.     i -status info   |     ? -help off           |  z/q -suspend/quit
  300. -------------------------------------------------------------------------------
  301. X,Y (x,y)  on the left are meta-symbols for the keys  A,B,C (a,b,c).
  302. X,Y on the right are meta-symbols for buffers A,B,C.
  303. A,B,C on the right denote the working buffers A,B,C, respectively."
  304.   "The tail of the full-help message.")
  305.  
  306. (defconst ediff-long-help-message-compare3
  307.   "
  308. p,DEL -previous diff |     | -vert/horiz split   | xy -copy buf X's region to Y
  309. n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
  310.     j -jump to diff  |     @ -auto-refinement    |  * -refine current region
  311.    gx -goto X's point|                           |  ! -update diff regions
  312.   C-l -recenter      |    ## -ignore whitespace  |
  313.   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
  314.   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
  315.                      |     m -wide display       |  ~ -rotate buffers
  316. "
  317.   "Help message usually used for 3-way comparison.
  318. Normally, not a user option. See `ediff-help-message' for details.")
  319.   
  320. (defconst ediff-long-help-message-compare2
  321.   "
  322. p,DEL -previous diff |     | -vert/horiz split   |a/b -copy A/B's region to B/A
  323. n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
  324.     j -jump to diff  |     @ -auto-refinement    |  * -refine current region
  325.    gx -goto X's point|                           |  ! -update diff regions
  326.   C-l -recenter      |    ## -ignore whitespace  |
  327.   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
  328.   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
  329.                      |     m -wide display       |  ~ -swap buffers
  330. "
  331.   "Help message usually used for 2-way comparison.
  332. Normally, not a user option. See `ediff-help-message' for details.")
  333.   
  334. (defconst ediff-long-help-message-narrow2
  335.   "
  336. p,DEL -previous diff |     | -vert/horiz split   |a/b -copy A/B's region to B/A
  337. n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
  338.     j -jump to diff  |     @ -auto-refinement    |  * -refine current region
  339.    gx -goto X's point|     % -narrow/widen buffs |  ! -update diff regions
  340.   C-l -recenter      |    ## -ignore whitespace  |
  341.   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
  342.   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
  343.                      |     m -wide display       |  ~ -swap buffers
  344. "
  345.   "Help message when comparing windows or regions line-by-line.
  346. Normally, not a user option. See `ediff-help-message' for details.")
  347.   
  348. (defconst ediff-long-help-message-word-mode
  349.   "
  350. p,DEL -previous diff |     | -vert/horiz split   | xy -copy buf X's region to Y
  351. n,SPC -next diff     |     h -hiliting           | rx -restore buf X's old diff
  352.     j -jump to diff  |                           |                   
  353.    gx -goto X's point|     % -narrow/widen buffs |  ! -recompute diffs
  354.   C-l -recenter      |                           |
  355.   v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
  356.   </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
  357.                      |     m -wide display       |  ~ -swap buffers
  358. "
  359.   "Help message when comparing windows or regions word-by-word.
  360. Normally, not a user option. See `ediff-help-message' for details.")
  361.   
  362. (defconst ediff-long-help-message-merge
  363.   "
  364. p,DEL -previous diff |     | -vert/horiz split   |  x -copy buf X's region to C
  365. n,SPC -next diff     |     h -hiliting           |  r -restore buf C's old diff
  366.     j -jump to diff  |     @ -auto-refinement    |  * -refine current region
  367.    gx -goto X's point|    ## -ignore whitespace  |  ! -update diff regions
  368.   C-l -recenter      | #f/#h -focus/hide regions |  + -combine diff regions
  369.   v/V -scroll up/dn  |     X -read-only in buf X | wx -save buf X
  370.   </> -scroll lt/rt  |     m -wide display       | wd -save diff output
  371.     / -ancestor buff |     s -shrink window C    |  ~ -swap buffers
  372.                      |     $ -show clashes only  |  & -merge w/new default
  373. "
  374.   "Help message during merging.
  375. Normally, not a user option. See `ediff-help-message' for details.")
  376.  
  377. ;; The actual long help message.
  378. (ediff-defvar-local ediff-long-help-message ""
  379.   "Normally, not a user option. See `ediff-help-message' for details.")
  380.   
  381. (defconst ediff-brief-message-string
  382.   "  ? - help  "
  383.   "Contents of the brief help message.")
  384. ;; The actual brief help message
  385. (ediff-defvar-local ediff-brief-help-message ""
  386.   "Normally, not a user option. See `ediff-help-message' for details.")
  387.   
  388. (ediff-defvar-local ediff-brief-help-message-custom nil
  389.   "The brief help message that the user can customize.
  390. If the user sets this to a parameter-less function, Ediff will use it to
  391. produce the brief help message. This function must return a string.")
  392. (ediff-defvar-local ediff-long-help-message-custom nil
  393.   "The long help message that the user can customize.
  394. See `ediff-brief-help-message-custom' for more.")
  395.  
  396. (defvar ediff-prefer-long-help-message nil
  397.   "*If t, Ediff starts with a long help message. Short help msg otherwise.")
  398.  
  399. ;; The actual help message.
  400. (ediff-defvar-local ediff-help-message ""
  401.   "The actual help message.
  402. Normally, the user shouldn't touch this. However, if you want Ediff to
  403. start up with different help messages for different jobs, you can change
  404. the value of this variable and the variables `ediff-help-message-*' in
  405. `ediff-startup-hooks'.") 
  406.  
  407. ;; Selective browsing
  408.  
  409. (ediff-defvar-local ediff-skip-diff-region-function 'ediff-show-all-diffs
  410.   "Function that determines the next/previous diff region to show.
  411. Should return t for regions to be ignored and nil otherwise.
  412. This function gets a region number as an argument. The region number
  413. is the one used internally by Ediff. It is 1 less than the number seen
  414. by the user.")
  415.  
  416. ;; Regexp that determines buf A regions to focus on when skipping to diff
  417. (ediff-defvar-local ediff-regexp-focus-A "" "")
  418. ;; Regexp that determines buf B regions to focus on when skipping to diff
  419. (ediff-defvar-local ediff-regexp-focus-B "" "")
  420. ;; Regexp that determines buf C regions to focus on when skipping to diff
  421. (ediff-defvar-local ediff-regexp-focus-C "" "")
  422. ;; connective that determines whether to focus regions that match both or
  423. ;; one of the regexps
  424. (ediff-defvar-local ediff-focus-regexp-connective 'and "")
  425.   
  426. ;; Regexp that determines buf A regions to ignore when skipping to diff
  427. (ediff-defvar-local ediff-regexp-hide-A "" "")
  428. ;; Regexp that determines buf B regions to ignore when skipping to diff
  429. (ediff-defvar-local ediff-regexp-hide-B "" "")
  430. ;; Regexp that determines buf C regions to ignore when skipping to diff
  431. (ediff-defvar-local ediff-regexp-hide-C "" "")
  432. ;; connective that determines whether to hide regions that match both or
  433. ;; one of the regexps
  434. (ediff-defvar-local ediff-hide-regexp-connective 'and "")
  435.   
  436.   
  437. (defvar ediff-ange-ftp-ftp-name (if ediff-xemacs-p
  438.                     'ange-ftp-ftp-path
  439.                   'ange-ftp-ftp-name)
  440.   "Function ange-ftp uses to find out if file is remote.")
  441.   
  442.  
  443. ;; Copying difference regions between buffers.    
  444. (ediff-defvar-local ediff-killed-diffs-alist nil
  445.   "A list of killed diffs. 
  446. A diff is saved here if it is replaced by a diff
  447. from another buffer.  This alist has the form:
  448. \((num (buff-object . diff) (buff-object . diff) (buff-object . diff)) ...),
  449. where some buffer-objects may be missing.")
  450.  
  451.  
  452. ;; Highlighting
  453. ;;(defvar ediff-before-flag-bol (if ediff-emacs-p "->>\n" (make-glyph "->>\n"))
  454. (defvar ediff-before-flag-bol (if ediff-xemacs-p (make-glyph "->>") "->>")
  455.   "*Flag placed above the highlighted block of differences. 
  456. Must end with newline.")
  457. ;;(defvar ediff-after-flag-eol  (if ediff-emacs-p "<<-\n" (make-glyph "<<-"))
  458. (defvar ediff-after-flag-eol  (if ediff-xemacs-p (make-glyph "<<-") "<<-")
  459.   "*Flag placed below the highlighted block of differences.
  460. Must end with newline.")
  461.  
  462. (defvar ediff-before-flag-mol (if ediff-xemacs-p (make-glyph "->>") "->>")
  463.   "*Like ediff-before-flag, used when a difference starts in mid-line.")
  464. (defvar ediff-after-flag-mol  (if ediff-xemacs-p (make-glyph "<<-") "<<-")
  465.   "*Like ediff-after-flag, used when a difference starts in mid-line.")
  466.  
  467.   
  468. (ediff-defvar-local ediff-use-faces t 
  469.   "If t, differences are highlighted using faces on a window system.
  470. If nil, they are highlighted using ASCII flags, ediff-before-flag
  471. and ediff-after-flag.  On a non-window system, differences are always
  472. highlighted using ASCII flags.
  473. This variable can be set either in .emacs or toggled interactively.
  474. Use `setq-default' if setting it in .emacs")
  475.  
  476.  
  477. ;; this indicates that diff regions are word-size, so fine diffs are
  478. ;; permanently nixed; used in ediff-windows-wordwise and ediff-regions-wordwise
  479. (ediff-defvar-local ediff-word-mode nil "")
  480. ;; Name of the job (ediff-files, ediff-windows, etc.)
  481. (ediff-defvar-local ediff-job-name nil "")
  482.  
  483. ;; Narrowing and ediff-region/windows support
  484. ;; This is a list (overlay-A overlay-B overlay-C)
  485. ;; If set, Ediff compares only those parts of buffers A/B/C that lie within
  486. ;; the bounds of these overlays.
  487. (ediff-defvar-local ediff-narrow-bounds nil "")
  488.  
  489. ;; List (overlay-A overlay-B overlay-C), where each overlay spans the
  490. ;; entire corresponding buffer.
  491. (ediff-defvar-local ediff-wide-bounds nil "")
  492.  
  493. ;; Current visibility boundaries in buffers A, B, and C.
  494. ;; This is also a list of overlays. When the user toggles narrow/widen,
  495. ;; this list changes from ediff-wide-bounds to ediff-narrow-bounds.
  496. ;; and back.
  497. (ediff-defvar-local ediff-visible-bounds nil "")
  498.  
  499. (ediff-defvar-local ediff-start-narrowed t
  500.   "Non-nil means start narrowed, if doing ediff-windows-* or ediff-regions-*")
  501. (ediff-defvar-local ediff-quit-widened t
  502.   "*Non-nil means: when finished, Ediff widens buffers A/B.
  503. Actually, Ediff restores the scope of visibility that existed at startup.")
  504. (defvar ediff-keep-variants t
  505.   "*Nil means that non-modified variant buffers should be removed after some
  506. interrogation.
  507. Supplying a prefix agument to the quit command `q' temporarily reverses the
  508. meaning of this variable.")
  509.  
  510. (ediff-defvar-local ediff-highlight-all-diffs t
  511.   "If nil, only the selected differences are highlighted.
  512. This variable can be set either in .emacs or toggled interactively, using
  513. ediff-toggle-hilit. Use `setq-default' to set it.") 
  514.  
  515. ;; A var local to each control panel buffer.  Indicates highlighting style
  516. ;; in effect for this buffer: `face', `ascii', nil -- temporarily
  517. ;; unhighlighted, `off' -- turned off \(on a dumb terminal only\).
  518. (ediff-defvar-local ediff-highlighting-style nil "")
  519.  
  520.  
  521. ;; Variables that control each Ediff session.  They are local to the
  522. ;; control buffer. 
  523.  
  524. ;; Mode variables
  525. ;; The buffer in which the A variant is stored.
  526. (ediff-defvar-local ediff-buffer-A nil "")
  527. ;; The buffer in which the B variant is stored.
  528. (ediff-defvar-local ediff-buffer-B nil "")
  529. ;; The buffer in which the C variant is stored.
  530. (ediff-defvar-local ediff-buffer-C nil "")
  531. ;; Ancestor buffer
  532. (ediff-defvar-local ediff-ancestor-buffer nil "")
  533. ;; The control buffer of ediff.
  534. (ediff-defvar-local ediff-control-buffer nil "")
  535.  
  536.   
  537. ;; The suffix of the control buffer name.
  538. (ediff-defvar-local ediff-control-buffer-suffix nil "")
  539. ;; Same as ediff-control-buffer-suffix, but without <,>. 
  540. ;; It's a number rather than string.
  541. (ediff-defvar-local ediff-control-buffer-number nil "")
  542.  
  543.  
  544. ;; The original values of ediff-protected-variables for buffer A
  545. (ediff-defvar-local ediff-buffer-values-orig-A nil "")
  546. ;; The original values of ediff-protected-variables for buffer B
  547. (ediff-defvar-local ediff-buffer-values-orig-B nil "")
  548. ;; The original values of ediff-protected-variables for buffer C
  549. (ediff-defvar-local ediff-buffer-values-orig-C nil "")
  550. ;; The original values of ediff-protected-variables for buffer Ancestor
  551. (ediff-defvar-local ediff-buffer-values-orig-Ancestor nil "")
  552. ;; Buffer-local variables to be saved then restored during Ediff sessions
  553. ;; Buffer-local variables to be saved then restored during Ediff sessions
  554. (defconst ediff-protected-variables '(buffer-read-only 
  555.                       mode-line-format))
  556.  
  557. ;; Vector of differences between the variants.  Each difference is
  558. ;; represented by a vector of two overlays plus a vector of fine diffs,
  559. ;; plus a no-fine-diffs flag.  The first overlay spans the
  560. ;; difference region in the A buffer and the second overlays the diff in
  561. ;; the B buffer. If a difference section is empty, the corresponding
  562. ;; overlay's endpoints coincide.
  563. ;;
  564. ;; The precise form of a difference vector for one buffer is:
  565. ;; [diff diff diff ...]
  566. ;; where each diff has the form:
  567. ;; [diff-overlay fine-diff-vector no-fine-diffs-flag state-of-difference]
  568. ;; fine-diff-vector is a vector [fine-diff-overlay fine-diff-overlay ...]
  569. ;; no-fine-diffs-flag says if there are fine differences.
  570. ;; state-of-difference is A, B, C, or nil, indicating which buffer is
  571. ;; different from the other two (used only in 3-way jobs.
  572. (ediff-defvar-local ediff-difference-vector-A nil "")
  573. (ediff-defvar-local ediff-difference-vector-B nil "")
  574. (ediff-defvar-local ediff-difference-vector-C nil "")
  575. (ediff-defvar-local ediff-difference-vector-Ancestor nil "")
  576.  
  577. ;; [ status status status ...]
  578. ;; Each status: [state-of-merge state-of-ancestor]
  579. ;; state-of-merge is default-A, default-B, prefer-A, or prefer-B. It
  580. ;; indicates the way a diff region was created in buffer C.
  581. ;; state-of-ancestor says if the corresponding region in ancestor buffer is
  582. ;; empty.
  583. (ediff-defvar-local ediff-state-of-merge nil "")
  584.  
  585. ;; The difference that is currently selected.
  586. (ediff-defvar-local ediff-current-difference -1 "")
  587. ;; Number of differences found.
  588. (ediff-defvar-local ediff-number-of-differences nil "")
  589.   
  590. ;; Buffer containing the output of diff, which is used by Ediff to step
  591. ;; through files.
  592. (ediff-defvar-local ediff-diff-buffer nil "")
  593. ;; Like ediff-diff-buffer, but contains context diff. It is not used by
  594. ;; Ediff, but it is saved in a file, if user requests so.
  595. (ediff-defvar-local ediff-custom-diff-buffer nil "")
  596. ;; Buffer used for diff-style fine differences between regions.
  597. (ediff-defvar-local ediff-fine-diff-buffer nil "")
  598. ;; Temporary buffer used for computing fine differences.
  599. (defconst ediff-tmp-buffer " *ediff-tmp*" "")
  600. ;; Buffer used for messages
  601. (defconst ediff-msg-buffer " *ediff-message*" "")
  602. ;; Buffer containing the output of diff when diff returns errors.
  603. (ediff-defvar-local ediff-error-buffer nil "")
  604. ;; Buffer to display debug info
  605. (ediff-defvar-local ediff-debug-buffer "*ediff-debug*" "")
  606.  
  607. ;; List of ediff control panels associated with each buffer A/B/C/Ancestor.
  608. ;; Not used any more, but may be needed in the future.
  609. (ediff-defvar-local ediff-this-buffer-ediff-sessions  nil "")
  610.  
  611. ;; to be deleted in due time
  612. ;; List of difference overlays disturbed by working with the current diff.
  613. (defvar ediff-disturbed-overlays nil "")
  614.   
  615. ;; Priority of non-selected overlays.
  616. (defvar ediff-shadow-overlay-priority  100 "")
  617.  
  618.  
  619. (if ediff-xemacs-p
  620.     (progn
  621.       (fset 'ediff-read-event (symbol-function 'next-command-event))
  622.       (fset 'ediff-overlayp (symbol-function 'extentp))
  623.       (fset 'ediff-make-overlay (symbol-function 'make-extent))
  624.       (fset 'ediff-delete-overlay (symbol-function 'delete-extent))
  625.       (fset 'ediff-overlay-buffer (symbol-function 'extent-buffer))
  626.       (fset 'ediff-overlay-get (symbol-function 'extent-property)))
  627.   (fset 'ediff-read-event (symbol-function 'read-event))
  628.   (fset 'ediff-overlayp (symbol-function 'overlayp))
  629.   (fset 'ediff-overlayp (symbol-function 'overlayp))
  630.   (fset 'ediff-make-overlay (symbol-function 'make-overlay))
  631.   (fset 'ediff-delete-overlay (symbol-function 'delete-overlay))
  632.   (fset 'ediff-overlay-buffer (symbol-function 'overlay-buffer))
  633.   (fset 'ediff-overlay-get (symbol-function 'overlay-get)))
  634.   
  635. ;; Check the current version against the major and minor version numbers
  636. ;; using op: cur-vers op major.minor If emacs-major-version or
  637. ;; emacs-minor-version are not defined, we assume that the current version
  638. ;; is hopelessly outdated.  We assume that emacs-major-version and
  639. ;; emacs-minor-version are defined.  Otherwise, for Emacs/XEmacs 19, if the
  640. ;; current minor version is < 10 (xemacs) or < 23 (emacs) the return value
  641. ;; will be nil (when op is =, >, or >=) and t (when op is <, <=), which may be
  642. ;; incorrect. However, this gives correct result in our cases, since we are
  643. ;; testing for sufficiently high Emacs versions.
  644. (defun ediff-check-version (op major minor &optional type-of-emacs)
  645.   (if (and (boundp 'emacs-major-version) (boundp 'emacs-minor-version))
  646.       (and (cond ((eq type-of-emacs 'xemacs) ediff-xemacs-p)
  647.          ((eq type-of-emacs 'emacs) ediff-emacs-p)
  648.          (t t))
  649.        (cond ((eq op '=) (and (= emacs-minor-version minor)
  650.                   (= emacs-major-version major)))
  651.          ((memq op '(> >= < <=))
  652.           (and (or (funcall op emacs-major-version major)
  653.                (= emacs-major-version major))
  654.                (if (= emacs-major-version major)
  655.                (funcall op emacs-minor-version minor)
  656.              t)))
  657.          (t
  658.           (error "%S: Invalid op in ediff-check-version" op))))
  659.     (cond ((memq op '(= > >=)) nil)
  660.       ((memq op '(< <=)) t))))
  661.   
  662.   
  663. ;;;; warn if it is a wrong version of emacs
  664. ;;(if (or (ediff-check-version '< 19 29 'emacs)
  665. ;;    (ediff-check-version '< 19 12 'xemacs))
  666. ;;    (progn
  667. ;;      (with-output-to-temp-buffer ediff-msg-buffer
  668. ;;    (switch-to-buffer ediff-msg-buffer)
  669. ;;    (insert
  670. ;;     (format "
  671. ;;
  672. ;;This version of Ediff requires 
  673. ;;
  674. ;;\t Emacs 19.29 and higher
  675. ;;\t OR
  676. ;;\t XEmacs 19.12 and higher
  677. ;;
  678. ;;It is unlikely to work under Emacs version %s
  679. ;;that you are using... " emacs-version))
  680. ;;    (if noninteractive
  681. ;;        ()
  682. ;;      (beep 1)
  683. ;;      (beep 1)
  684. ;;      (insert "\n\nType any key to continue...")
  685. ;;      (ediff-read-event)))
  686. ;;      (kill-buffer ediff-msg-buffer)))
  687.  
  688. ;; A fix for NeXT Step
  689. ;; Should probably be eliminated in later versions.
  690. (if (and (ediff-window-display-p) (eq (ediff-device-type) 'ns))
  691.     (progn
  692.       (fset 'x-display-color-p (symbol-function 'ns-display-color-p))
  693.       (fset 'x-color-defined-p (symbol-function 'ns-color-defined-p))
  694.       (fset 'x-display-pixel-height (symbol-function 'ns-display-pixel-height))
  695.       (fset 'x-display-pixel-width (symbol-function 'ns-display-pixel-width))
  696.       ))
  697.  
  698.  
  699. (defsubst ediff-color-display-p ()
  700.   (if ediff-emacs-p
  701.       (x-display-color-p)
  702.     (eq (device-class (selected-device)) 'color)))
  703.  
  704.   
  705. (if (ediff-window-display-p)
  706.     (if ediff-xemacs-p
  707.     (progn
  708.       (fset 'ediff-display-pixel-width
  709.         (symbol-function 'device-pixel-width))
  710.       (fset 'ediff-display-pixel-height
  711.         (symbol-function 'device-pixel-height))
  712.       (fset 'ediff-valid-color-p (symbol-function 'valid-color-name-p))
  713.       (fset 'ediff-get-face (symbol-function 'get-face)))
  714.       ;; Temporary fix for OS/2 port of Emacs
  715.       ;; pm-win.el in PM-Emacs should be fixed.
  716.       (fset 'ediff-display-pixel-width 
  717.         (symbol-function 'x-display-pixel-width))
  718.       (fset 'ediff-display-pixel-height
  719.         (symbol-function 'x-display-pixel-height))
  720.       (if (eq (ediff-device-type) 'pm)
  721.       (fset 'ediff-valid-color-p 
  722.         (function (lambda (color) (assoc color pm-color-alist))))
  723.     (fset 'ediff-valid-color-p (symbol-function 'x-color-defined-p)))
  724.       (fset 'ediff-get-face (symbol-function 'internal-get-face))))
  725.       
  726.  
  727. (defun ediff-make-current-diff-overlay (type)
  728.   (if (ediff-window-display-p)
  729.       (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type)))
  730.         (buffer (ediff-get-buffer type))
  731.         (face (face-name
  732.            (symbol-value
  733.             (intern (format "ediff-current-diff-face-%S" type))))))
  734.     (set overlay
  735.          (ediff-make-bullet-proof-overlay (point-max) (point-max) buffer))
  736.     (ediff-set-overlay-face (symbol-value overlay) face)
  737.     (ediff-overlay-put (symbol-value overlay) 'ediff ediff-control-buffer))
  738.     ))
  739.  
  740. (defun ediff-set-overlay-face (extent face)
  741.   (ediff-overlay-put extent 'face face)
  742.   (ediff-overlay-put extent 'help-echo 'ediff-region-help-echo))
  743.  
  744. ;; This does nothing in Emacs, since overlays there have no help-echo property
  745. (defun ediff-region-help-echo (extent)
  746.   (let ((is-current (ediff-overlay-get extent 'ediff))
  747.     (face (ediff-overlay-get extent 'face))
  748.     (diff-num (ediff-overlay-get extent 'ediff-diff-num))
  749.     face-help help-msg)
  750.  
  751.     ;; This happens only for refinement overlays
  752.     (setq face-help (and face (get face 'ediff-help-echo)))
  753.  
  754.     (setq help-msg
  755.       (cond ((and is-current diff-num) ; current diff region
  756.          (format "Difference region %S -- current" (1+ diff-num)))
  757.         (face-help) ; refinement of current diff region
  758.         (diff-num ; non-current
  759.          (format "Difference region %S -- non-current" (1+ diff-num)))
  760.         (t ""))))) ; none
  761.  
  762. (defun ediff-set-face (ground face color)
  763.   "Set face foreground/background."
  764.   (if (ediff-window-display-p)
  765.       (if (ediff-valid-color-p color)
  766.       (if (eq ground 'foreground)
  767.           (set-face-foreground face color)
  768.         (set-face-background face color))
  769.     (cond ((memq face
  770.              '(ediff-current-diff-face-A
  771.                ediff-current-diff-face-B
  772.                ediff-current-diff-face-C
  773.                ediff-current-diff-face-Ancestor))
  774.            (copy-face 'highlight face))
  775.           ((memq face
  776.              '(ediff-fine-diff-face-A
  777.                ediff-fine-diff-face-B
  778.                ediff-fine-diff-face-C
  779.                ediff-fine-diff-face-Ancestor))
  780.            (copy-face 'secondary-selection face)
  781.            (set-face-underline-p face t))
  782.           ((memq face
  783.              '(ediff-even-diff-face-A
  784.                ediff-odd-diff-face-A 
  785.                ediff-even-diff-face-B ediff-odd-diff-face-B
  786.                ediff-even-diff-face-C ediff-odd-diff-face-C
  787.                ediff-even-diff-face-Ancestor
  788.                ediff-odd-diff-face-Ancestor))
  789.            (copy-face 'secondary-selection face))))
  790.     ))
  791.       
  792. (defvar ediff-current-diff-face-A
  793.   (if (ediff-window-display-p)
  794.       (progn
  795.     (make-face 'ediff-current-diff-face-A)
  796.     (or (face-differs-from-default-p 'ediff-current-diff-face-A)
  797.         (cond ((ediff-color-display-p)
  798.            (ediff-set-face
  799.             'foreground 'ediff-current-diff-face-A "firebrick")
  800.            (ediff-set-face
  801.             'background 'ediff-current-diff-face-A "pale green"))
  802.           (t
  803.            (if ediff-xemacs-p
  804.                (copy-face 'modeline 'ediff-current-diff-face-A)
  805.              (copy-face 'highlight 'ediff-current-diff-face-A))
  806.            )))
  807.     'ediff-current-diff-face-A))
  808.   "Face for highlighting the selected difference in buffer A.")
  809.  
  810. (defvar ediff-current-diff-face-B
  811.   (if (ediff-window-display-p)
  812.       (progn
  813.     (make-face 'ediff-current-diff-face-B)
  814.     (or (face-differs-from-default-p 'ediff-current-diff-face-B)
  815.         (cond ((ediff-color-display-p)
  816.            (ediff-set-face
  817.             'foreground 'ediff-current-diff-face-B "DarkOrchid")
  818.            (ediff-set-face
  819.             'background 'ediff-current-diff-face-B "Yellow"))
  820.           (t 
  821.            (if ediff-xemacs-p
  822.                (copy-face 'modeline 'ediff-current-diff-face-B)
  823.              (copy-face 'highlight 'ediff-current-diff-face-B))
  824.            )))
  825.     'ediff-current-diff-face-B))
  826.   "Face for highlighting the selected difference in buffer B.")
  827.     
  828.  
  829. (defvar ediff-current-diff-face-C
  830.   (if (ediff-window-display-p)
  831.       (progn
  832.     (make-face 'ediff-current-diff-face-C)
  833.     (or (face-differs-from-default-p 'ediff-current-diff-face-C)
  834.         (cond ((ediff-color-display-p)
  835.            (ediff-set-face
  836.             'foreground 'ediff-current-diff-face-C "Navy")
  837.            (ediff-set-face
  838.             'background 'ediff-current-diff-face-C "Pink"))
  839.           (t 
  840.            (if ediff-xemacs-p
  841.                (copy-face 'modeline 'ediff-current-diff-face-C)
  842.              (copy-face 'highlight 'ediff-current-diff-face-C))
  843.            )))
  844.     'ediff-current-diff-face-C))
  845.   "Face for highlighting the selected difference in buffer C.")
  846.  
  847. (defvar ediff-current-diff-face-Ancestor
  848.   (if (ediff-window-display-p)
  849.       (progn
  850.     (make-face 'ediff-current-diff-face-Ancestor)
  851.     (or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor)
  852.         (copy-face 
  853.          'ediff-current-diff-face-C 'ediff-current-diff-face-Ancestor))))
  854.   "Face for highlighting the selected difference in the ancestor buffer.")
  855.  
  856. (defvar ediff-fine-diff-face-A
  857.   (if (ediff-window-display-p)
  858.       (progn
  859.     (make-face 'ediff-fine-diff-face-A)
  860.     (or (face-differs-from-default-p 'ediff-fine-diff-face-A)
  861.         (cond ((ediff-color-display-p)
  862.            (ediff-set-face 'foreground 'ediff-fine-diff-face-A
  863.                    "Navy")
  864.            (ediff-set-face 'background 'ediff-fine-diff-face-A
  865.                    "sky blue"))
  866.           (t (set-face-underline-p 'ediff-fine-diff-face-A t))))
  867.     'ediff-fine-diff-face-A))
  868.   "Face for highlighting the refinement of the selected diff in buffer A.")
  869.  
  870. (defvar ediff-fine-diff-face-B
  871.   (if (ediff-window-display-p)
  872.       (progn
  873.     (make-face 'ediff-fine-diff-face-B)
  874.     (or (face-differs-from-default-p 'ediff-fine-diff-face-B)
  875.         (cond ((ediff-color-display-p)
  876.            (ediff-set-face 'foreground 'ediff-fine-diff-face-B "Black")
  877.            (ediff-set-face 'background 'ediff-fine-diff-face-B "cyan"))
  878.           (t (set-face-underline-p 'ediff-fine-diff-face-B t))))
  879.     'ediff-fine-diff-face-B))
  880.   "Face for highlighting the refinement of the selected diff in buffer B.")
  881.     
  882. (defvar ediff-fine-diff-face-C
  883.   (if (ediff-window-display-p)
  884.       (progn
  885.     (make-face 'ediff-fine-diff-face-C)
  886.     (or (face-differs-from-default-p 'ediff-fine-diff-face-C)
  887.         (cond ((ediff-color-display-p)
  888.            (ediff-set-face 'foreground 'ediff-fine-diff-face-C "black")
  889.            (ediff-set-face
  890.             'background 'ediff-fine-diff-face-C "Turquoise"))
  891.           (t (set-face-underline-p 'ediff-fine-diff-face-C t))))
  892.     'ediff-fine-diff-face-C))
  893.   "Face for highlighting the refinement of the selected diff in buffer C.")
  894.  
  895. (defvar ediff-fine-diff-face-Ancestor
  896.   (if (ediff-window-display-p)
  897.       (progn
  898.     (make-face 'ediff-fine-diff-face-Ancestor)
  899.     (or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor)
  900.         (copy-face
  901.          'ediff-fine-diff-face-C 'ediff-fine-diff-face-Ancestor))))
  902.   "Face highlighting refinements of the selected diff in ancestor buffer.
  903. Presently, this is not used, as difference regions are not refined in the
  904. ancestor buffer.")
  905.     
  906. (defvar ediff-even-diff-face-A
  907.   (if (ediff-window-display-p)
  908.       (progn
  909.     (make-face 'ediff-even-diff-face-A)
  910.     (or (face-differs-from-default-p 'ediff-even-diff-face-A)
  911.         (cond ((ediff-color-display-p)
  912.            (ediff-set-face
  913.             'foreground 'ediff-even-diff-face-A "black")
  914.            (ediff-set-face
  915.             'background 'ediff-even-diff-face-A "light grey"))
  916.           (t 
  917.            (copy-face 'italic 'ediff-even-diff-face-A))))
  918.     'ediff-even-diff-face-A))
  919.   "Face used to highlight even-numbered differences in buffer A.")
  920.       
  921. (defvar ediff-even-diff-face-B
  922.   (if (ediff-window-display-p)
  923.       (progn
  924.     (make-face 'ediff-even-diff-face-B)
  925.     (or (face-differs-from-default-p 'ediff-even-diff-face-B)
  926.         (cond ((ediff-color-display-p)
  927.            (ediff-set-face
  928.             'foreground 'ediff-even-diff-face-B "White")
  929.            (ediff-set-face
  930.             'background 'ediff-even-diff-face-B "Gray"))
  931.           (t 
  932.            (copy-face 'italic 'ediff-even-diff-face-B))))
  933.     'ediff-even-diff-face-B))
  934.   "Face used to highlight even-numbered differences in buffer B.")
  935.     
  936. (defvar ediff-even-diff-face-C
  937.   (if (ediff-window-display-p)
  938.       (progn
  939.     (make-face 'ediff-even-diff-face-C)
  940.     (or (face-differs-from-default-p 'ediff-even-diff-face-C)
  941.         (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C))
  942.     'ediff-even-diff-face-C))
  943.   "Face used to highlight even-numbered differences in buffer C.")
  944.  
  945. (defvar ediff-even-diff-face-Ancestor
  946.   (if (ediff-window-display-p)
  947.       (progn
  948.     (make-face 'ediff-even-diff-face-Ancestor)
  949.     (or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor)
  950.         (copy-face 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor))
  951.     'ediff-even-diff-face-Ancestor))
  952.   "Face highlighting even-numbered differences in the ancestor buffer.")
  953.   
  954. (defvar ediff-odd-diff-face-A
  955.   (if (ediff-window-display-p)
  956.       (progn
  957.     (make-face 'ediff-odd-diff-face-A)
  958.     (or (face-differs-from-default-p 'ediff-odd-diff-face-A)
  959.         (cond ((ediff-color-display-p)
  960.            (ediff-set-face
  961.             'foreground 'ediff-odd-diff-face-A "White")
  962.            (ediff-set-face
  963.             'background 'ediff-odd-diff-face-A "Gray"))
  964.           (t 
  965.            (copy-face 'italic 'ediff-odd-diff-face-A))))
  966.     'ediff-odd-diff-face-A))
  967.   "Face used to highlight odd-numbered differences in buffer A.")
  968.       
  969. (defvar ediff-odd-diff-face-B
  970.   (if (ediff-window-display-p)
  971.       (progn
  972.     (make-face 'ediff-odd-diff-face-B)
  973.     (or (face-differs-from-default-p 'ediff-odd-diff-face-B)
  974.         (cond ((ediff-color-display-p)
  975.            (ediff-set-face
  976.             'foreground 'ediff-odd-diff-face-B "Black")
  977.            (ediff-set-face
  978.             'background 'ediff-odd-diff-face-B "light grey"))
  979.           (t 
  980.            (copy-face 'italic 'ediff-odd-diff-face-B))))
  981.     'ediff-odd-diff-face-B))
  982.   "Face used to highlight odd-numbered differences in buffer B.")
  983.     
  984. (defvar ediff-odd-diff-face-C
  985.   (if (ediff-window-display-p)
  986.       (progn
  987.     (make-face 'ediff-odd-diff-face-C)
  988.     (or (face-differs-from-default-p 'ediff-odd-diff-face-C)
  989.         (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C))
  990.     'ediff-odd-diff-face-C))
  991.   "Face used to highlight odd-numbered differences in buffer C.")
  992.  
  993. (defvar ediff-odd-diff-face-Ancestor 
  994.   (if (ediff-window-display-p)
  995.       (progn
  996.     (make-face 'ediff-odd-diff-face-Ancestor)
  997.     (or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor)
  998.         (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor))
  999.     'ediff-odd-diff-face-Ancestor))
  1000.   "Face used to highlight even-numbered differences in the ancestor buffer.")
  1001.  
  1002. ;; Help echo
  1003. (put 'ediff-fine-diff-face-A 'ediff-help-echo
  1004.      "A `refinement' of the current difference region")
  1005. (put 'ediff-fine-diff-face-B 'ediff-help-echo
  1006.      "A `refinement' of the current difference region")
  1007. (put 'ediff-fine-diff-face-C 'ediff-help-echo
  1008.      "A `refinement' of the current difference region")
  1009. (put 'ediff-fine-diff-face-Ancestor 'ediff-help-echo
  1010.      "A `refinement' of the current difference region")
  1011.  
  1012.  
  1013. ;;; Overlays
  1014.  
  1015. (ediff-defvar-local ediff-current-diff-overlay-A nil
  1016.   "Overlay for the current difference region in buffer A.")
  1017. (ediff-defvar-local ediff-current-diff-overlay-B nil
  1018.   "Overlay for the current difference region in buffer B.")
  1019. (ediff-defvar-local ediff-current-diff-overlay-C nil
  1020.   "Overlay for the current difference region in buffer C.")
  1021. (ediff-defvar-local ediff-current-diff-overlay-Ancestor nil
  1022.   "Overlay for the current difference region in the ancestor buffer.")
  1023.   
  1024. ;; Compute priority of ediff overlay.
  1025. (defun ediff-highest-priority (start end buffer)
  1026.   (let ((pos (max 1 (1- start)))
  1027.     ovr-list)
  1028.     (if ediff-xemacs-p
  1029.     (1+ ediff-shadow-overlay-priority)
  1030.       (ediff-eval-in-buffer buffer
  1031.     (while (< pos (min (point-max) (1+ end)))
  1032.       (setq ovr-list (append (overlays-at pos) ovr-list))
  1033.       (setq pos (next-overlay-change pos)))
  1034.     (1+ (apply '+
  1035.            (mapcar (function
  1036.                 (lambda (ovr)
  1037.                   (if ovr
  1038.                   (or (ediff-overlay-get ovr 'priority) 0)
  1039.                 0)))
  1040.                ovr-list)
  1041.            ))
  1042.     ))))
  1043.   
  1044.     
  1045. (defvar ediff-toggle-read-only-function nil
  1046.   "*Specifies the function to be used to toggle read-only.
  1047. If nil, Ediff tries to deduce the function from the binding of C-x C-q.
  1048. Normally, this is the `toggle-read-only' function, but, if version
  1049. control is used, it could be `vc-toggle-read-only' or `rcs-toggle-read-only'.")
  1050.  
  1051.  
  1052. ;;; Misc
  1053.  
  1054. ;; if nil, this silences some messages
  1055. (defconst ediff-verbose-p t)
  1056.   
  1057. (defvar ediff-no-emacs-help-in-control-buffer nil
  1058.   "*Non-nil means C-h should not invoke Emacs help in control buffer.
  1059. Instead, C-h jumps to previous difference.")
  1060.   
  1061. (defvar ediff-temp-file-prefix
  1062.   (let ((env (or (getenv "TMPDIR")
  1063.          (getenv "TMP")
  1064.          (getenv "TEMP")))
  1065.     d)
  1066.     (setq d (if (and env (> (length env) 0))
  1067.         env
  1068.           (if (memq system-type '(vax-vms axp-vms))
  1069.           "SYS$SCRATCH:"
  1070.         "/tmp")))
  1071.     ;; The following is to make sure we get something to which we can
  1072.     ;; add directory levels on VMS.
  1073.     (setq d (file-name-as-directory (directory-file-name d)))
  1074.     )
  1075.   "*Prefix to put on Ediff temporary file names.
  1076. Do not start with `~/' or `~user-name/'.")  
  1077.  
  1078. (defvar ediff-temp-file-mode 384    ; u=rw only
  1079.   "*Mode for Ediff temporary files.")
  1080.   
  1081. ;; Metacharacters that have to be protected from the shell when executing
  1082. ;; a diff/diff3 command.
  1083. (defvar ediff-metachars "[ \t\n!\"#$&'()*;<=>?[\\^`{|~]"
  1084.   "Characters that must be quoted with \\ when used in a shell command line.
  1085. More precisely, a regexp to match any one such character.")
  1086.  
  1087.   
  1088. (ediff-defvar-local ediff-temp-file-A nil
  1089.   "Temporary file used for refining difference regions in buffer A.")
  1090. (ediff-defvar-local ediff-temp-file-B nil
  1091.   "Temporary file used for refining difference regions in buffer B.")
  1092. (ediff-defvar-local ediff-temp-file-C nil
  1093.   "Temporary file used for refining difference regions in buffer C.")
  1094.  
  1095. ;;; In-line functions
  1096.  
  1097. (defsubst ediff-file-remote-p (file-name)
  1098.   (if (fboundp ediff-ange-ftp-ftp-name)
  1099.       (funcall ediff-ange-ftp-ftp-name file-name)))
  1100.  
  1101. ;;(defun ediff-frame-has-menubar ()
  1102. ;;  (and (ediff-window-display-p)
  1103. ;;       (if ediff-xemacs-p
  1104. ;;       current-menubar
  1105. ;;     (let ((lines (cdr (assq 'menu-bar-lines
  1106. ;;                 (frame-parameters (selected-frame))))))
  1107. ;;       (or (eq lines t) (and (numberp lines) (< 0 lines))))
  1108. ;;     )))
  1109.     
  1110. (defsubst ediff-frame-unsplittable-p (frame)
  1111.   (cdr (assq 'unsplittable (frame-parameters frame))))
  1112.  
  1113. (defsubst ediff-get-next-window (wind prev-wind)
  1114.   (or (window-live-p wind)
  1115.       (setq wind (if prev-wind
  1116.              (next-window wind)
  1117.            (selected-window)))))
  1118.  
  1119.  
  1120. (defsubst ediff-kill-buffer-carefully (buf)
  1121.   "Kill buffer BUF if it exists."
  1122.   (if (ediff-buffer-live-p buf)
  1123.       (kill-buffer (get-buffer buf))))
  1124.       
  1125.  
  1126. (defsubst ediff-highlight-diff (n)
  1127.   "Put face on diff N.  Invoked for X displays only."
  1128.   (ediff-highlight-diff-in-one-buffer n 'A)
  1129.   (ediff-highlight-diff-in-one-buffer n 'B)
  1130.   (ediff-highlight-diff-in-one-buffer n 'C)
  1131.   (ediff-highlight-diff-in-one-buffer n 'Ancestor)
  1132.   )
  1133.  
  1134.  
  1135. (defsubst ediff-unhighlight-diff ()
  1136.   "Remove overlays from buffers A, B, and C."
  1137.   (ediff-unhighlight-diff-in-one-buffer 'A)
  1138.   (ediff-unhighlight-diff-in-one-buffer 'B)
  1139.   (ediff-unhighlight-diff-in-one-buffer 'C)
  1140.   (ediff-unhighlight-diff-in-one-buffer 'Ancestor)
  1141.   )
  1142.     
  1143. ;; delete highlighting overlays, restore faces to their original form
  1144. (defsubst ediff-unhighlight-diffs-totally ()
  1145.   (ediff-unhighlight-diffs-totally-in-one-buffer 'A)
  1146.   (ediff-unhighlight-diffs-totally-in-one-buffer 'B)
  1147.   (ediff-unhighlight-diffs-totally-in-one-buffer 'C)
  1148.   (ediff-unhighlight-diffs-totally-in-one-buffer 'Ancestor)
  1149.   )
  1150.  
  1151. (defsubst ediff-background-face (buf-type dif-num)
  1152.   ;; The value of dif-num is always 1- the one that user sees.
  1153.   ;; This is why even face is used when dif-num is odd.
  1154.   (intern (format (if (ediff-odd-p dif-num)
  1155.               "ediff-even-diff-face-%S"
  1156.             "ediff-odd-diff-face-%S")
  1157.           buf-type)))
  1158.     
  1159.       
  1160. ;; arg is a record for a given diff in a difference vector
  1161. ;; this record is itself a vector
  1162. (defsubst ediff-clear-fine-diff-vector (diff-record)
  1163.   (if diff-record
  1164.       (mapcar 'ediff-delete-overlay
  1165.           (ediff-get-fine-diff-vector-from-diff-record diff-record))))
  1166.           
  1167. (defsubst ediff-clear-fine-differences-in-one-buffer (n buf-type)
  1168.   (ediff-clear-fine-diff-vector (ediff-get-difference n buf-type))
  1169.   (ediff-set-fine-diff-vector n buf-type nil))
  1170.   
  1171. (defsubst ediff-clear-fine-differences (n)
  1172.   (ediff-clear-fine-differences-in-one-buffer n 'A)
  1173.   (ediff-clear-fine-differences-in-one-buffer n 'B)
  1174.   (if ediff-3way-job
  1175.       (ediff-clear-fine-differences-in-one-buffer n 'C)))
  1176.       
  1177.  
  1178. (defsubst ediff-convert-fine-diffs-to-overlays (diff-list region-num)
  1179.   (ediff-set-fine-overlays-in-one-buffer 'A diff-list region-num)
  1180.   (ediff-set-fine-overlays-in-one-buffer 'B diff-list region-num)
  1181.   (if ediff-3way-job
  1182.       (ediff-set-fine-overlays-in-one-buffer 'C diff-list region-num)
  1183.     ))
  1184.   
  1185. (defsubst ediff-mouse-event-p (event)
  1186.   (if ediff-xemacs-p
  1187.       (button-event-p event)
  1188.     (string-match "mouse" (format "%S" (event-basic-type event)))
  1189.     ))
  1190.  
  1191.  
  1192. (defsubst ediff-key-press-event-p (event)
  1193.   (if ediff-xemacs-p
  1194.       (key-press-event-p event)
  1195.     (or (char-or-string-p event) (symbolp event))))
  1196.  
  1197. (defun ediff-event-point (event)
  1198.   (cond ((ediff-mouse-event-p event)
  1199.      (if ediff-xemacs-p
  1200.          (event-point event)
  1201.        (posn-point (event-start event))))
  1202.     ((ediff-key-press-event-p event)
  1203.      (point))
  1204.     (t (error))))
  1205.  
  1206. (defun ediff-event-buffer (event)
  1207.   (cond ((ediff-mouse-event-p event)
  1208.      (if ediff-xemacs-p
  1209.          (event-buffer event)
  1210.        (window-buffer (posn-window (event-start event)))))
  1211.     ((ediff-key-press-event-p event)
  1212.      (current-buffer))
  1213.     (t (error))))
  1214.    
  1215.     
  1216. (defsubst ediff-frame-iconified-p (frame)
  1217.   (if (and (ediff-window-display-p) (frame-live-p frame))
  1218.       (if ediff-xemacs-p
  1219.       (frame-iconified-p frame)
  1220.     (eq (frame-visible-p frame) 'icon))))
  1221.     
  1222. (defsubst ediff-window-visible-p (wind)
  1223.   ;; under TTY, window-live-p also means window is visible
  1224.   (and (window-live-p wind)
  1225.        (or (not (ediff-window-display-p))
  1226.        (frame-visible-p (window-frame wind)))))
  1227.   
  1228.  
  1229. (defsubst ediff-frame-char-width (frame)
  1230.   (if ediff-xemacs-p
  1231.       (/ (frame-pixel-width frame) (frame-width frame))
  1232.     (frame-char-width frame)))
  1233.     
  1234. (defun ediff-reset-mouse (&optional frame)
  1235.   (or frame (setq frame (selected-frame)))
  1236.   (if (ediff-window-display-p)
  1237.       (let ((frame-or-wind frame))
  1238.     (if ediff-xemacs-p 
  1239.         (setq frame-or-wind (frame-selected-window frame)))
  1240.     (set-mouse-position frame-or-wind 1 0)
  1241.     (select-frame frame) ; probably redundant
  1242.     )))
  1243.     
  1244. (defsubst ediff-frame-char-height (frame)
  1245.   (if ediff-xemacs-p
  1246.       (/ (frame-pixel-height frame) (frame-height frame))
  1247.     (frame-char-height frame)))
  1248.     
  1249.  
  1250. (defsubst ediff-empty-overlay-p (overl)
  1251.   (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
  1252.   
  1253. ;; t if diff region is empty.
  1254. ;; In case of buffer C, t also if it is not a 3way
  1255. ;; comparison job (merging jobs return t as well).
  1256. (defun ediff-empty-diff-region-p (n buf-type)
  1257.   (if (eq buf-type 'C)
  1258.       (or (not ediff-3way-comparison-job)
  1259.       (= (ediff-get-diff-posn 'C 'beg n)
  1260.          (ediff-get-diff-posn 'C 'end n)))
  1261.     (= (ediff-get-diff-posn buf-type 'beg n)
  1262.        (ediff-get-diff-posn buf-type 'end n))))
  1263.        
  1264. ;; Test if diff region is white space only.
  1265. ;; If 2-way job and buf-type = C, then returns t.
  1266. (defun ediff-whitespace-diff-region-p (n buf-type)
  1267.   (or (and (eq buf-type 'C) (not ediff-3way-job))
  1268.       (let ((beg (ediff-get-diff-posn buf-type 'beg n))
  1269.         (end (ediff-get-diff-posn buf-type 'end n)))
  1270.     (ediff-eval-in-buffer (ediff-get-buffer buf-type)
  1271.       (save-excursion
  1272.         (goto-char beg)
  1273.         (skip-chars-forward ediff-whitespace)
  1274.         (>= (point) end))))))
  1275.         
  1276. ;; temporarily uses DIR to abbreviate file name
  1277. ;; if DIR is nil, use default-directory
  1278. (defsubst ediff-abbreviate-file-name (file &optional dir)
  1279.   (cond ((stringp dir)
  1280.      (let ((directory-abbrev-alist (list (cons dir ""))))
  1281.        (abbreviate-file-name file)))
  1282.     (ediff-emacs-p (abbreviate-file-name file))
  1283.     (t ; XEmacs requires addl argument
  1284.      (abbreviate-file-name file t))))
  1285.  
  1286. ;; Takes a directory and returns the parent directory.
  1287. ;; does nothing to `/'. If the ARG is a regular file,
  1288. ;; strip the file AND the last dir.
  1289. (defun ediff-strip-last-dir (dir)
  1290.   (if (not (stringp dir)) (setq dir default-directory))
  1291.   (setq dir (expand-file-name dir))
  1292.   (or (file-directory-p dir) (setq dir (file-name-directory dir)))
  1293.   (let* ((pos (1- (length dir)))
  1294.      (last-char (aref dir pos)))
  1295.     (if (and (> pos 0) (= last-char ?/))
  1296.     (setq dir (substring dir 0 pos)))
  1297.     (ediff-abbreviate-file-name (file-name-directory dir))))
  1298.  
  1299. (defun ediff-truncate-string-left (str newlen)
  1300.   ;; leave space for ... on the left
  1301.   (let ((len (length str))
  1302.     substr)
  1303.     (if (<= len newlen)
  1304.     str
  1305.       (setq newlen (max 0 (- newlen 3)))
  1306.       (setq substr (substring str (max 0 (- len 1 newlen))))
  1307.       (concat "..." substr))))
  1308.  
  1309. (defun ediff-abbrev-jobname (jobname)
  1310.   (cond ((eq jobname 'ediff-directories)
  1311.      "Compare two directories")
  1312.     ((eq jobname 'ediff-files)
  1313.      "Compare two files")
  1314.     ((eq jobname 'ediff-buffers)
  1315.      "Compare two buffers")
  1316.     ((eq jobname 'ediff-directories3)
  1317.      "Compare three directories")
  1318.     ((eq jobname 'ediff-files3)
  1319.      "Compare three files")
  1320.     ((eq jobname 'ediff-buffers3)
  1321.      "Compare three buffers")
  1322.     ((eq jobname 'ediff-revision)
  1323.      "Compare file with a version")
  1324.     ((eq jobname 'ediff-directory-revisions)
  1325.      "Compare dir files with versions")
  1326.     ((eq jobname 'ediff-merge-directory-revisions)
  1327.      "Merge dir files with versions")
  1328.     ((eq jobname 'ediff-merge-directory-revisions-with-ancestor)
  1329.      "Merge dir versions via ancestors")
  1330.     (t
  1331.      (let* ((str (substring (symbol-name jobname) 6))
  1332.         (len (length str))
  1333.         (pos 0))
  1334.        (while (< pos len)
  1335.          (if (= pos 0)
  1336.          (aset str pos (upcase (aref str pos))))
  1337.          (if (= (aref str pos) ?-)
  1338.          (aset str pos ?\ ))
  1339.          (setq pos (1+ pos)))
  1340.        str))))
  1341.   
  1342.  
  1343.     
  1344. (defsubst ediff-get-region-contents (n buf-type ctrl-buf &optional start end)
  1345.   (ediff-eval-in-buffer 
  1346.       (ediff-eval-in-buffer ctrl-buf (ediff-get-buffer buf-type))
  1347.     (buffer-substring
  1348.      (or start (ediff-get-diff-posn buf-type 'beg n ctrl-buf))
  1349.      (or end (ediff-get-diff-posn buf-type 'end n ctrl-buf)))))
  1350.   
  1351. ;; If ediff modified mode line, strip the modification
  1352. (defsubst ediff-strip-mode-line-format ()
  1353.   (if (member (car mode-line-format) '(" A: " " B: " " C: " " Ancestor: "))
  1354.       (setq mode-line-format (nth 2 mode-line-format))))
  1355.  
  1356. ;; Verify that we have a difference selected.
  1357. (defsubst ediff-valid-difference-p (&optional n)
  1358.   (or n (setq n ediff-current-difference))
  1359.   (and (>= n 0) (< n ediff-number-of-differences)))
  1360.   
  1361. (defsubst ediff-show-all-diffs (n)
  1362.   "Don't skip difference regions."
  1363.   nil)
  1364.  
  1365. (defsubst Xor (a b)
  1366.   (or (and a (not b)) (and (not a) b)))
  1367.      
  1368. (provide 'ediff-init)
  1369.  
  1370.  
  1371. ;;; ediff-init.el  ends here
  1372.